home *** CD-ROM | disk | FTP | other *** search
-
- uses crt;
- {
- Public Domain Code By David Henningsson 1996 (DIWIC)
- Spread it and use it, if you like.
- Written in Turbo Pascal 6.0
- Warning: This stuff is very slow and inoptimal.
- Do some "brain physics" and speed it up yourself!
- }
-
-
- const Svgatext:Array[0..4,0..15] of Byte = (
- (0,1,1,0,1,0,1,0,0,1,1,0,0,1,0,0),
- (1,0,0,0,1,0,1,0,1,0,0,0,1,0,1,0),
- (0,1,0,0,1,0,1,0,1,0,1,0,1,1,1,0),
- (0,0,1,0,1,1,1,0,1,0,1,0,1,0,1,0),
- (1,1,0,0,0,1,0,0,0,1,1,0,1,0,1,0));
-
-
- var Pro:Procedure;
- CurBank:Byte;
-
- { Only for 640x480x256 }
- Procedure PutVpixel(X,Y:Word;F:Byte); assembler;
- asm
- mov ax,640
- mul Y
- add ax,X { If this putpixel routine seems to skip parts of the screen }
- adc dx,0 { or overwrites stuff already written }
- mov bx,4096 { <- try changing this number (to another power of two) }
- div bx { This line is inoptimal... }
- xchg ax,dx
- push ax
- cmp dl,CurBank
- je @@DontSwitchBanks
- mov CurBank,dl
- mov ax,$4F05
- mov bx,0
- Call Pro
- @@DontSwitchBanks:
- pop di
- mov ax,0A000h
- mov es,ax
- mov al,F
- stosb
- end;
-
- { Goes a little bit faster, inline bank switching, only for Cirrus Logic }
- { Have tried to optimize it a bit }
- Procedure PutVpixel2(X,Y:Word;F:Byte); assembler;
- asm
- mov ax,640
- mul Y
- add ax,X
- adc dx,0
- mov di,ax
- mov ah,dl
- shl ah,4
- cmp ah,CurBank
- je @@DontSwitchBanks
- mov CurBank,ah
- mov dx,$3CE
- { in al,dx } { These four lines don't seem to be needed. If there is }
- { mov bl,al } { trouble, try putting them back in business.}
- mov al,9
- out dx,ax
- { mov al,bl }
- { out dx,al }
- @@DontSwitchBanks:
- mov ax,0A000h
- mov es,ax
- mov al,F
- stosb
- end;
-
- var I,J:Integer;
- K,L,M:Byte;
- Pal:Array[0..255,1..3] of Byte;
-
- begin
- asm
- mov ax,$4F02
- mov bx,$101
- int 10h { Set SVGA mode: 640x480x256 }
- mov ax,$4F01
- mov cx,$101
- push ds
- pop es
- mov di,OFFSET Pal
- int 10h
- mov di,OFFSET Pal+12
- mov bx,[di]
- mov cx,[di+2]
- mov WORD [Pro],bx
- mov WORD [Pro+2],cx { Look up pointer to bank switcher }
- end;
- CurBank := 255; { Will always switch banks the first time }
- Fillchar(Pal,Sizeof(Pal),0);
- For I := 0 to 63 do begin
- Pal[I,1] := I;
- Pal[I+64,1] := 63-I;
- Pal[I+64,2] := I;
- Pal[I+128,2] := 63-I;
- Pal[I+128,3] := I;
- Pal[I+192,3] := 63-I;
- end;
- asm
- cld
- mov si,OFFSET Pal
- mov cx,256*3
- mov dx,$3C8
- mov al,0
- out dx,al
- inc dx
- rep outsb { Set palette }
- end;
-
- { K is random, since it is uninitialized! }
- For J := 0 to 479 div 6 do begin
- For I := 0 to 639 div 16 do begin
- Inc(K);
- For L := 0 to 4 do
- For M := 0 to 15 do
- If Svgatext[L,M] <> 0 then
- PutVPixel(I*16+M,J*6+L,K); { Here is the inoptimal stuff lying }
- end;
- Dec(K,43);
- end;
- Directvideo := FALSE;
- Textattr := 128;
- WindMax := 30*256+80; { Sets up the CRT unit }
- GotoXY(28,15);
- Writeln('Is this SVGA or aint it?');
- GotoXY(25,17);
- Writeln('Is this 640x480x256 or aint it?');
- REadkey;
- Textmode(3);
- end.